package cn.iocoder.yudao.module.hs.service.rfid;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.rfid.vo.RfidPageReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.rfid.vo.RfidSaveReqVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.rfid.RfidDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * RFID信息 Service 接口
 *
 * @author 航盛
 */
public interface RfidService {

    /**
     * 创建RFID信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createRfid(@Valid RfidSaveReqVO createReqVO);

    /**
     * 更新RFID信息
     *
     * @param updateReqVO 更新信息
     */
    void updateRfid(@Valid RfidSaveReqVO updateReqVO);

    /**
     * 删除RFID信息
     *
     * @param id 编号
     */
    void deleteRfid(Long id);

    /**
     * 获得RFID信息
     *
     * @param id 编号
     * @return RFID信息
     */
    RfidDO getRfid(Long id);

    /**
     * 获得RFID信息分页
     *
     * @param pageReqVO 分页查询
     * @return RFID信息分页
     */
    PageResult<RfidDO> getRfidPage(RfidPageReqVO pageReqVO);

    /**
     * 通过rfidCode获取RfidDO
     *
     * @param rfidCode RFID编码
     * @return RfidDO
     */
    RfidDO getRfid(String rfidCode);

    /**
     * 更新被更换下来的RFID
     *
     * @param rfidDO RFID
     */
    void updateRfidChanged(RfidDO rfidDO);

    /**
     * 将列表中的物料统一更换到新的RFID
     *
     * @param rfidCode RFID编码
     */
    void changeRfid(String rfidCode, List<String> materialCodeList);

    /**
     * 将旧RFID上的物料及物料箱更换到新RFID
     *
     * @param oldRfidCode 旧RFID编码
     * @param newRfidCode 新RFID编码
     */
    void changeRfid(String oldRfidCode, String newRfidCode);

    /**
     * 通过trayCode获取RfidDO
     *
     * @param trayCode
     * @return
     */
    RfidDO getRfidByTrayCode(String trayCode);

    /**
     * 通过trayCode获取RfidDO
     *
     * @param trayCodes
     * @return
     */
    Map<String, RfidDO> getRfidByTrayCode(Set<String> trayCodes);

    /**
     * 绑定托盘和RFID信息
     * @param trayCode
     * @param rfidCode
     */
    void bind(String trayCode, String rfidCode);

    /**
     * 解绑托盘和RFID信息
     * @param trayCodes
     */
    void unbind(Set<String> trayCodes);

    /**
    /**
     * 获得低电量RFID数量
     *
     * @return
     */
    Integer getLowBatteryCount();

    /**
     * 三方仓更新RFID信息，已出库
     *
     * @param rfidCodes
     * @return
     */
    void updateRfidOut(Set<String> rfidCodes, Long toWarehouseDeptId);
}